package com.i360day.invoker.annotation;

import com.i360day.invoker.HttpInvokerClientFactoryBean;
import com.i360day.invoker.HttpInvokerServiceExporter;
import com.i360day.invoker.hystrix.DefaultFallbackFactory;
import com.i360day.invoker.hystrix.FallbackFactory;
import com.i360day.invoker.support.RemoteExporter;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Component;

import java.lang.annotation.*;


/**
 * @description:  rpc客户端
 * @author: 胡.青牛
 * @date: 2019/4/27 0027  15:19
 *
 **/
@Component
@Documented
@RemoteModule
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.TYPE})
public @interface RemoteClient {
    /**
     * 客户端代理类
     * @return
     */
    Class<? extends FactoryBean> clientProxyClass() default HttpInvokerClientFactoryBean.class;

    /**
     * 服务端代理类
     * @return
     */
    Class<? extends RemoteExporter> serverProxyClass() default HttpInvokerServiceExporter.class;
    /**
     * 接口调用出错后，回调类
     * @return
     */
    Class<?> fallback() default void.class;

    /**
     * 回调类工厂
     * @return
     */
    Class<? extends FallbackFactory> fallbackFactory() default DefaultFallbackFactory.class;

    /**
     * 模块ID，applicationName 。注：在使用cloud注册中心情况下使用
     * @return
     */
    @AliasFor(annotation = RemoteModule.class)
    String name() default "";

    /**
     * 如果address不等于空，则向这个地址发送HTTP请求
     * @return
     */
    @AliasFor(annotation = RemoteModule.class)
    String address() default  "";

    /**
     * 项目根路径，如果没有则不填写
     * @return
     */
    @AliasFor(annotation = RemoteModule.class)
    String contextPath() default "";

    /**
     * 如果出现多个同样的bean，设置该bean为默认
     * @return
     */
    boolean primary() default true;

    /**
     * 分组
     * 如：v1、v2、v3...
     * @return
     */
    String group() default "";

    /**
     * 版本号
     * 如：1.0.0
     * @return
     */
    String version() default "";

    /**
     * 自定义参数
     * 如：createSocketServer=true/false
     * @return
     */
    Argument[] argument() default {};
}
